4.6 拆分为表列
1、拆分列
被处理的数据类型必须是字符串类型,结构为s.srt函数,如果Series的数据类型不是文本字符类型,则需要转换。
s.str.split(pat=none,n=-1,expand=”true”)
pat :可先参数,拆分时的分隔符,可以是普通字符或正则表达式,如果未指定,则按空格拆分。
n :可选参数,设置拆分次数,none,-1,0都表示全部拆分。
expand :可选参数,是否将拆分的字符串展开为单独的列,如果为True,则返因DataFrame表格,如果为False,则返回为含字符串的列表Series数据,默为False
import pandas as pd
s=pd.Series([ "lucas-95-34","lily-23","Bob-76-35" ])
t1=s.str.split( "-" )
t2=s.str.split( "-" , expand = True )
print (t1)
print (t2)
返回:
0 | [lucas, | 95, | 34] |
1 | [lily, | 23] | |
2 | [Bob, | 76, | 35] |
dtype: object
0 | 1 | 2 | |
---|---|---|---|
0 | lucas | 95 | 34 |
1 | lily | 23 | None |
2 | Bob | 76 | 35 |
import pandas as pd
s=pd.Series([ "lucas95","lily23","Bob35" ])
t1=s.str.split( "(?<=\D)(?=\d)" , expand = True )
t2=s.str.split( "(?<=\D)(?=\d)" )
print (t1)
print (t2)
返回:
0 | 1 | |
---|---|---|
0 | lucas | 95 |
1 | lily | 23 |
2 | Bob | 35 |
0 | [lucas, | 95] |
1 | [lily, | 23] |
2 | [Bob, | 35] |
dtype: object
import pandas as pd ,numpy as np
df=pd.read_excel(r "D:\Pyobject2023\object\测试\素材\测试素材.拆分后求和.xlsx" )
print (df)
df[ "总分" ]=df.分数.str.split( "、" ).apply( lambda l :sum(np.array( l , dtype = "int" )))
print (df)
返回:
部门 | 分数 | |
---|---|---|
0 | 销售部 | 88、78、65 |
1 | 财务部 | 98、54、67、44 |
2 | IT部 | 99、73 |
部门 | 分数 | 总分 | |
---|---|---|---|
0 | 销售部 | 88、78、65 | 231 |
1 | 财务部 | 98、54、67、44 | 263 |
2 | IT部 | 99、73 | 172 |
3、提取(向列方向扩展)
在pandas中,如果需要执行数据的提取,则使用s.str.extract()函数。
s.srt.extract(pat,flags=0,expand=True)
pat :分组的正则表达式模式,如果命名分组,则是列名
flags :re模块中的标志
expand :如果为True,则返回DataFrame,如果为False,只有1个分组返回Series,有多个分组则返回DataFrame
import pandas as pd
s=pd.Series([ "张三100","lucass78","Bob78" ])
t=s.str.extract( "(?P<:姓名>:\D+)(?P<:分数>:\d+)" )
print (t)
返回:
姓名 | 分数 | |
---|---|---|
0 | 张三 | 100 |
1 | lucass | 78 |
2 | Bob | 78 |
4、提取(向行方向扩展)
可以用extractal()函数扩展为多行
import pandas as pd
s=pd.Series([ "张三100李四45","lucass78jim67","Bob78狗剩45" ])
df=s.str.extractall( "(?P<:姓名>:\D+)(?P<:分数>:\d+)" ).astype({ "分数":"int" })
t=df.分数.sum()
print (t)
print (df)
返回:
413
姓名 | 分数 | ||
---|---|---|---|
match | |||
0 | 0 | 张三 | 100 |
1 | 李四 | 45 | |
1 | 0 | lucass | 78 |
1 | jim | 67 | |
2 | 0 | Bob | 78 |
1 | 狗剩 | 45 |
5、提取(提取列的金额,姓名,分数)
import pandas as pd
df=pd.read_excel(r "D:\Pyobject2023\object\测试\素材\测试素材.提取金额、姓名.xlsx","采购" )
print (df)
df["金额"]=df.数据.str.extract( "(\d+)元" , expand = False )
print (df)
返回
产品 | 数据 | |
---|---|---|
0 | 茄子 | 10kg88元 |
1 | 牛肉 | 4100元(25kg) |
2 | 鸡蛋 | 100枚99元 |
3 | 牛奶 | 5件400元 |
产品 | 数据 | 金额 | |
---|---|---|---|
0 | 茄子 | 10kg88元 | 88 |
1 | 牛肉 | 4100元(25kg) | 4100 |
2 | 鸡蛋 | 100枚99元 | 99 |
3 | 牛奶 | 5件400元 | 400 |
import pandas as pd
df=pd.read_excel(r "D:\Pyobject2023\object\测试\素材\测试素材.提取金额、姓名.xlsx","名单" , index_col=0 )
print (df)
t=df.名单.str.extractall( "(?P<:姓名>:[一-龟]+)(?P<:分数>:\d+)" )
print (t)
返回:
名单 | |
---|---|
组别 | |
A组 | 张三33分,李四99分 |
B组 | 小明56分,小灰灰95分,小杰93分 |
C组 | 大志若遇100分 |
姓名 | 分数 | ||
---|---|---|---|
组别 | match | ||
A组 | 0 | 张三 | 33 |
1 | 李四 | 99 | |
B组 | 0 | 小明 | 56 |
1 | 小灰灰 | 95 | |
2 | 小杰 | 93 | |
C组 | 0 | 大志若遇 | 100 |